package project.code.common;

import org.apache.log4j.Logger;


public class Pruebas {
	
	private static final Logger  logger  = Logger.getLogger(Pruebas.class);
	
	/**
	 * en el constructor mando a correr la que quiero
	 */
	public Pruebas(){

	
		//entrenarIndividualesNuevasPalabras();
		//totalRecursivo();
		
		//entrenarTodosLosCoefJuantos();
		
		entrenarIndividualesViejo();
	}
	
	

	/**
	 * Con los datos reales pero con 39 coeficientes
	 * tambien agrega salidas de basura, para cuendo no corresponde a ninguno
	 * @param args
	 */
	public static void trainNetFinal(String trainFile,String trainExpectedFile,String errorFile,String resultFile,String bkp,String probarRed,String probarResul,int numOfEpoch) {

		//numero de neuronas en la capa de entradas
		int inRowNumber = 58;
		//numero de neuronas en cada capa oculta
		int hiddenRowNumber = 40;
		//numero de neuronas en la capa de salida
		int outRowNumber = 3;
		//numero de capas ocultas
		int hiddenLayerNumber = 1;

		BackPropagacion back= new BackPropagacion(trainFile,trainExpectedFile,errorFile,resultFile,
										inRowNumber,hiddenRowNumber,outRowNumber,hiddenLayerNumber);

		back.train("1-58","1-3",226,0.97,0.05,numOfEpoch);
		
		back.saveNeuralNet(bkp);
		
		
		back.Go(probarRed,probarResul,"1-58",54);


	}

		

	
	public static void entrenarIndividualesNuevasPalabras(){
		String dirGlobal = "d:\\WAVS_TO_COEF\\Prueba8\\generados\\";
		
		int numOfEpoch=15000;
		
		for(int i=1;i<40;i++){

			System.out.println("----------------------------------------INICIA COEF "+i+"-------------------------------------------------------------------");
			String dir=dirGlobal+"coef"+i+"\\";
			trainNetFinal(dir+"paraentrenar.txt",
					 dir+"paraentrenarresultados.txt",
					 dir+"errores.txt",
					 dir+"resultados.txt",
					 dir+"redBkp_"+numOfEpoch+"Epoch_coef"+i,
					 dir+"paraprobar.txt",
					 dir+"paraprobarresultados.txt",
					 numOfEpoch);
		}
			
	}
	
	
	   public static void entrenarTodosLosCoefJuantos(){
	        String dirGlobal = "d:\\WAVS_TO_COEF\\Prueba9\\generadosPalabras\\";
	        
	        int numOfEpoch=250;
	        
            System.out.println("----------------------------------------INICIA ENTRENAMIENTOS-------------------------------------------------------------------");
            trainNetFinalTodosLosCoefJuntos(dirGlobal+"paraentrenar.txt",
                    dirGlobal+"paraentrenarresultados.txt",
                    dirGlobal+"errores.txt",
                    dirGlobal+"resultados.txt",
                    dirGlobal+"redBkp_"+numOfEpoch+"Epoch",
                    dirGlobal+"paraprobar.txt",
                    dirGlobal+"paraprobarresultados.txt",
                    numOfEpoch);
	            
	    }
	   
	    /**
	     * Con los datos reales pero con 39 coeficientes
	     * tambien agrega salidas de basura, para cuendo no corresponde a ninguno
	     * @param args
	     */
	    public static void trainNetFinalTodosLosCoefJuntos(String trainFile,String trainExpectedFile,String errorFile,String resultFile,String bkp,String probarRed,String probarResul,int numOfEpoch) {

	        //numero de neuronas en la capa de entradas
	        int inRowNumber = 2262;
	        //numero de neuronas en cada capa oculta
	        int hiddenRowNumber = 1900;
	        //numero de neuronas en la capa de salida
	        int outRowNumber = 3;
	        //numero de capas ocultas
	        int hiddenLayerNumber = 1;

	        BackPropagacion back= new BackPropagacion(trainFile,trainExpectedFile,errorFile,resultFile,
	                                        inRowNumber,hiddenRowNumber,outRowNumber,hiddenLayerNumber);

	        back.train("1-2262","1-3",256,0.97,0.05,numOfEpoch);
	        
	        back.saveNeuralNet(bkp);
	        
	        
	        back.Go(probarRed,probarResul,"1-2262",24);


	    }


	/*****************************************************************************
	 * EJECUCION TOTAL
	 *****************************************************************************/
	
	public static void totalRecursivo(){
		
		int numOfEpoch = 2500;
		double learRate =0.8;
		double momentum =0.2;
		//numero de neuronas en cada capa oculta
		int hiddenRowNumber = 45;
		//numero de capas ocultas
		int hiddenLayerNumber = 1;

		
		while (BackPropagacion.menorErrorGlobal > 0.3 ) {
			
			if (hiddenLayerNumber>3){
				
				hiddenLayerNumber=1;
			
			}else {
				
				if (hiddenRowNumber>65){
					
					hiddenRowNumber = 45;
				
				}else {
					
					if (numOfEpoch>16001){
						
						numOfEpoch = 2500;
						
					}else {
						
					
						if (momentum<0){
							
							momentum = 0.3;
						
						}else {
			
							if (learRate > 1){
								
								learRate = 0.7;
							
							}else{
								
								for(int i=1;i<40;i++){
					
									logger.info("----------------------------------------INICIA COEF "+i+"-------------------------------------------------------------------");
									logger.info("----Epoch       : " +numOfEpoch);
									logger.info("----Learn Rate  : " +learRate);
									logger.info("----Momentum    : " +momentum);
									logger.info("----hidden row  : " +hiddenRowNumber);
									logger.info("----hidden layer: " +hiddenLayerNumber);
									
									train(i,numOfEpoch,learRate,momentum,hiddenRowNumber,hiddenLayerNumber);
									
								}
								
								learRate+=0.1;
								continue;
								
							}
							
							momentum-=0.1;
							continue;
			
						}
					
						numOfEpoch+=3000;
						continue;
					}	
					
					
					hiddenRowNumber+=1;
					continue;
				}
			
				hiddenLayerNumber+=1;
				continue;
			
			}
		}//while
		
	}

	
	/**
	 * Con los datos reales pero con 13 coeficientes
	 * tambien agrega salidas de basura, para cuendo no corresponde a ninguno
	 * @param args
	 */
	public static void train(int i,int numOfEpoch, double learningRate, double momentun, int hiddenRowNumber, int hiddenLayerNumber) {

		String dirGlobal = "d:\\WAVS_TO_COEF\\Prueba6\\generados\\";
		String dir=dirGlobal+"coef"+i+"\\";
	
		//numero de neuronas en la capa de entradas
		int inRowNumber = 58;
		//numero de neuronas en la capa de salida
		int outRowNumber = 3;

		BackPropagacion back= new BackPropagacion(dir+"paraentrenar.txt",dir+"paraentrenarresultados.txt",dir+"errores.txt",dir+"resultados.txt",
										inRowNumber,hiddenRowNumber,outRowNumber,hiddenLayerNumber);

		back.train("1-58","1-3",241,learningRate,momentun,numOfEpoch);
		
		back.saveNeuralNet(dir+"redBkp_"+numOfEpoch+"Epoch_coef"+i);
		
		
		back.Go(dir+"paraprobar.txt",dir+"paraprobarresultados.txt","1-58",70);


	}

		

	//PROBANDO LO VIEJO
	
	

	   public static void entrenarIndividualesViejo(){
//        String dirGlobal = "D:\\processFiles\\individuales13\\generados\\";
	   
	       String dirGlobal = "D:\\WAVS_TO_COEF\\Naty\\Prueba1\\generados\\";
	             
        int numOfEpoch=15000;
        
        for(int i=1;i<40;i++){

            System.out.println("----------------------------------------INICIA COEF "+i+"-------------------------------------------------------------------");
            String dir=dirGlobal+"coef"+i+"\\";
            trainNet(dir+"paraentrenar.txt", dir+"paraentrenarresultados.txt", dir+"errores.txt", dir+"resultados.txt",
                     dir+"redBkp_"+numOfEpoch+"Epoch_coef"+i, dir+"paraprobar.txt", dir+"paraprobarresultados.txt",
                     numOfEpoch, 
                     237, //casos de entrenamiento
                     54,  //casos de prueba
                     67,  //inRowNumber
                     55,  //hiddenRowNumber
                     3,   //outRowNumber
                     1,   //hiddenLayerNumber
                     0.2F,//momentum
                     0.9F//learningRate 
                     );
        }
        

           
    }
	   
	    /**
	     * Con los datos reales pero con 39 coeficientes
	     * tambien agrega salidas de basura, para cuendo no corresponde a ninguno
	     * 
	     * @param trainFile         = archivo donde tengo los valores para entrenar la red
	     * @param trainExpectedFile = archivo donde tengo los resultados esperados para cada registro del entrenamiento
	     * @param errorFile         = archivo para guardar los errores que puedan suceder
	     * @param resultFile        = se guarda el resultado que se obtiene al correr la red
	     * @param bkp               = nombre del archivo donde se guarda los valores de las neuronas cuando la red ya fue entrenada
	     * @param probarRed         = nombre del archivo donde estan los registros para probar la red entrenada
	     * @param probarResul       = nombre del archivo donde tengo los resultados para cada registro de la prueba de la red
	     * @param numOfEpoch        = cantidad de veces que voy a entrener la red con el set de datos pasado
         * @param numOfTrainCase    = cantidad de casos de entrenamiento (registros), que tiene el archivo para entrenar la red 
         * @param numOfTestCase     = cantidad de casos de prueba (registros), que tiene el archivo para probar la red 
	     * @param inRowNumber       = numero de neuronas en la capa de entradas
	     * @param hiddenRowNumber   = numero de neuronas en cada capa oculta
	     * @param outRowNumber      = numero de neuronas en la capa de salida
	     * @param hiddenLayerNumber = numero de capas ocultas
	     * @param momentum          = momentum 
	     * @param learningRate      = learningRate 
	     * @param args
	     */
	    public static void trainNet(String trainFile,String trainExpectedFile,String errorFile,String resultFile,String bkp,
	                                String probarRed,String probarResul,int numOfEpoch,int numOfTrainCase,int numOfTestCase,
	                                int inRowNumber, int hiddenRowNumber,int outRowNumber, int hiddenLayerNumber,
	                                float momentum, float learningRate) {

	      
	        BackPropagacion back= new BackPropagacion(trainFile,trainExpectedFile,errorFile,resultFile,
	                                        inRowNumber,hiddenRowNumber,outRowNumber,hiddenLayerNumber);

	        String inData = "1-"+Integer.toString(inRowNumber);
	        back.train(inData,"1-3",numOfTrainCase,learningRate,momentum,numOfEpoch);
	        
	        back.saveNeuralNet(bkp);
	        
	        back.Go(probarRed,probarResul,inData,numOfTestCase);


	    }


	
}
